package com.zui.manager;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;

import com.zui.util.Page;

public interface SessionManager<T, ID extends Serializable> {

	public T saveEntity(T entity);

	public void updateEntity(T entity);

	public void deleteEntity(T entity);

	public void deleteEntityById(Class<T> c, ID id);
	/**
	 * Update the delete tag of the entities to "Y".
	 * @param c Class
	 * @param ids An array of String id;
	 */
	public void deleteEngtityFlagByIds(Class<T> c, String[] ids);

	public T findById(Class<T> c, ID id);

	public T loadById(Class<T> c, ID id);

	public List<T> loadAll(Class<T> c);

	public void saveOrUpdate(T entity);

	/**
	 * 使用命名的HQL语句更新数据
	 * 
	 * @param queryName
	 * @param values
	 */
	public int updateByNamedQuery(String queryName, Object[] values);

	/**
	 * 使用带参数的命名HSQL语句查询数据
	 * 
	 * @param queryName
	 * @param values
	 * @return
	 */
	public List<T> findByNamedQuery(String queryName, Object[] values);

	/**
	 * 通过合并的方式更新对象
	 * 
	 * @param entity
	 *            void
	 */
	public void merge(T entity);

	public void saveOrUpdateAll(Collection<T> entities);

	/**
	 * 判断某属性值的对象是否存在
	 */
	public boolean checkExistence(DetachedCriteria criteria);

	/**
	 * 按属性查找唯一对象.
	 */
	public T findUniqueByProperty(Class<T> c, String propertyName, Object value);
	/**
	 * 使用指定的检索标准检索数据
	 * 
	 * @param criteria
	 * @return
	 */
	public List<T> findByCriteria(DetachedCriteria criteria);
	/**
	 * 
	 * @param criteria
	 * @param page
	 * @return
	 */
	public List<T> findByCriteria(DetachedCriteria criteria, Page page);
	/**
	 * 根据criteria和orderList进行分页查询。
	 * 
	 * 出于性能考虑排序信息请勿放在criteria里，由本方法负责。
	 * 
	 * @param criteria
	 *            查询条件
	 * @param page
	 *            分页信息
	 * @param orderList
	 *            定制化的排序列表
	 * @return 包含分页信息的对象列表。对象为根对象。
	 */
	public List<T> findByCriteria(DetachedCriteria criteria, Page page,
			List<Order> orderList);

	public List<T> createSQLQuery(String nativeSql);

	
	/**
	 * 根据criteria和orderList进行分页查询。
	 * 
	 * 出于性能考虑排序信息请勿放在criteria里，由本方法负责。
	 * 
	 * @param criteria
	 *            查询条件
	 * @param page
	 *            分页信息
	 * @param orderList
	 *            定制化的排序列表
	 * @return JQGridListImpl,包含分页信息的对象列表。对象为根对象。
	 */
	public List<T> findByCriteriaForJQGrid(DetachedCriteria criteria, Page page,
			List<Order> orderList);
	/**
	 * 根据criteria进行分页查询。
	 * 
	 * @param criteria
	 *            查询条件
	 * @param page
	 *            分页信息
	 * @return 对象为根对象。
	 */
	public List<T> findByCriteriaForJQGrid(DetachedCriteria criteria, Page page);
}
